﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Data.Sql;
using System.Data.SqlClient;

using System.Threading;

using System.IO;

using System.Security.Permissions;

using Accesos;

namespace modUsuarios.Formularios
{
    public partial class frmServidor : Form
    {
        public frmServidor()
        {
            InitializeComponent();
        }
        private string DBConeccionString = null;//Nombre del motor de la base de datos
        private SqlConnection DBConeccion = null;//Varible de prueba para ver si el sistema funciona
        private DataTable TablaDeServidores = null;//un tabla virtual 

        private Thread Funcion = null;
        private delegate void FuncionDelegada();//funcion que separa los procesamientos en dos partes 
        //busqueda de servidor y mostrar la imagen de guia

        private bool Alternal = true;

        private string varNombreCuenta;
        private string varClaveCuenta;
        private string varTipoCuenta;
        private string varEstado = "Conetado";
        private const string ServidorDireccion = @"F:\Servidor.txt";
        private string varMensaje="";


        private void frmServidor_Load(object sender, EventArgs e)
        {
            txtBaseConeccion.Enabled = false;
            txtBaseConeccion.Text = "AMDENET";
            pibAnimacionTrac.Enabled = false;

            if (metExisteArhivo(ServidorDireccion) == true)
            {
                using (StreamReader Ser = File.OpenText(ServidorDireccion))
                {
                    //se accede al archivo creado y se busca el nombre de la base de datos que se almaceno en ella
                    //de no existir no existira ingreso en esta zona del programa
                    string Cam = "";
                    while ((Cam = Ser.ReadLine()) != null)
                    {
                        cmbServidorConeccion.Text = Cam;
                    }
                }
                cmbServidorConeccion.Enabled = false;
                btnAcepServidor.PerformClick();

            }

            btnAcepServidor.Enabled = false;

        }



       

        private void metBuscarServidor()
        {
            //Parte del codigo que busca el nombre de todos lo motores de base de datos conectados 
            //en la red luego lo se mezclara con el resto de la direccion para obtener el nombre completo
            //que permitira obtener el nombre de acceso al sistema ACOSIS
            try
            {
                DataTable Servicios = SqlDataSourceEnumerator.Instance.GetDataSources();
                TablaDeServidores = Servicios;
                //En esta parte se activa la barra de animacion por medio de delegados
                pibAnimacionTrac.Invoke(new FuncionDelegada(metFinalizarFuncion));

            }
            catch (Exception Mas)
            {
                varMensaje = Mas.ToString();
            }
            Thread.Sleep(0);
        }

        public string VarMensajeR
        {
            get
            {
                //En este metodo de retorna el nombre del usuario que se a escrito en la aplicacion
                return varTipoCuenta;
            }

        }



        private void metConeccionProcesada()
        {
            frmRegistro Aux = new frmRegistro();
            try
            {

                if (Aux.ShowDialog() == DialogResult.OK)//Activa la ventana para el ingreso del nombre y la clave
                {
                    //En esta parte del codigo se busca los usuarios registrados en la base de datos siempre va a ingresar con el 
                    //usuario sa para acceso a la base de datos ACOSIS pero si en la tabla de Administracion no se encuentra el 
                    //usuario ingresado en la tabla siguiente no podra ingresar en la aplicacion la seguridad que se maneja en 
                    //esta parte del proyecto es via aplicacion

                    DBConeccionString = "Data Source=" + cmbServidorConeccion.Text + ";";
                    DBConeccionString = DBConeccionString + " User ID=" + "sa" + "; Password=" + "123" + ";";
                    /////Alerta///////Normas de seguridad password controlado por Administrador ingreso solo de Administracion y de programacion

                    DBConeccion = new SqlConnection(DBConeccionString);

                    /*Estado de verificacion*/
                    //INICIO
                    //En esta area del codigo se ve los usuarios que existen registrados en la base de datos
                    //solo se activara si el nombre y la clave ingresados estan en la tabla tAdministracion

                    Accesos.Clases.clsCuentas auxTipo = new Accesos.Clases.clsCuentas();

                    varNombreCuenta = Aux.NombreUsuario;//devuelve el nombre de la cuenta ingresada
                    varClaveCuenta = Aux.ClaveUsuario;//devuelve la clave ingresada
                    auxTipo.metActivarNombreCuenta(DBConeccionString + " Initial Catalog=" + "AMDENET");
                    varTipoCuenta = auxTipo.metNombreGrupo(varNombreCuenta, varClaveCuenta);//con esos datos
                    //solicita a la clase administrador el tipo de cuenta para dr los permisos
                    //MessageBox.Show(varTipoCuenta);
                    try
                    {
                        //En esta parte de la aplicacion se verifica si esta en orden la conexion de la base de datos en la cual se 
                        //ingresa con el usuario sa
                        DBConeccion.Open();
                        DBConeccion.Close();
                    }
                    catch (Exception men)
                    {
                        //Si existe algun problema con la conexion se desplegara un mensaje el contador control se incrementara
                        //en uno solo se tiene 3 opciones de equivocacion si no el sistema impedira el ingreso
                        MessageBox.Show(men.Message);
                        DBConeccionString = null;
                        metConeccionProcesada();
                    }

                    /*fin de estado de verificacion*/
                }
                else
                {
                    DBConeccionString = null;
                    DBConeccion = null;
                    varEstado = "Cancelado";

                }


            }
            catch (Exception Mascara)
            {
                MessageBox.Show(Mascara.Message);
            }

        }

        private bool metExisteArhivo(string Cara)
        {
            //Verificacion del archivo en el se encuentra la base de datos
            //si es verdadero existe caso contrario
            //pide que se cree buscando la direccion de la base de datos
            if (File.Exists(Cara))
                return true;
            else
                return false;
        }



        private void metGuardarArchivo(string Direccion, string Texto)
        {
            //Crea el archivo lo codifica y lo guarda
            using (FileStream Pala = File.Create(Direccion))
            {
                Byte[] Infor = new UTF8Encoding(true).GetBytes(Texto);
                Pala.Write(Infor, 0, Infor.Length);
            }

        }



        public string ConeccionString
        {
            //DBConeccionString es el nombre del motor de la base de datos si es nulo el metodo devuelve un error 
            //pero como texto

            get
            {
                if (DBConeccionString != null)
                    return DBConeccionString + " Initial Catalog=" + "AMDENET";
                else
                    return "ERROR";
            }
        }

        public string metNombreUsuario
        {
            get
            {
                //Retorno del nombre de la cuenta a la que se va a acceder
                return varNombreCuenta;
            }
        }

        public string metTipoCuenta
        {
            get
            {
                // esta parte del codigo es para la generacion de permisos en la aplicacion existen un numero de 
                //permisos para cada uno de los usuarios dependiendo del tipo del mismo
                return varTipoCuenta;
            }
        }

        public string metServidor
        {
            get
            {
                return cmbServidorConeccion.Text;
            }
        }

        private void metFinalizarFuncion()
        {
            if (metExisteArhivo(ServidorDireccion) == false)
            {
                for (int i = 0; i < TablaDeServidores.Rows.Count; i++)
                {
                    //En este metodo se escribe ya las direcciones encontradas en el desplegable
                    //del combo para que se seleccione si la seleccion es erronea el usuario tiene la opcion de 
                    //hacer una nueva llamada y seleccionar la correcta
                    cmbServidorConeccion.Items.Add(TablaDeServidores.Rows[i]["ServerName"] + "\\" + TablaDeServidores.Rows[i]["InstanceName"]);

                }
                //Regreso de todos lo contadores usados 
                cmbServidorConeccion.SelectedIndex = 0;
                pibAnimacionTrac.Enabled = false;
                pibAnimacionTrac.Visible = false;
                btnAcepServidor.Enabled = true;//El boton se activa una ves que el control de busqueda este terminado 

            }
        }

     

      

       

        private void frmServidor_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }


        public string metEstadoConexion
        {
            get
            {
                return varEstado;
            }
        }

        private void cmbServidorConeccion_MouseClick(object sender, MouseEventArgs e)
        {
            if (Alternal == true)
            {
                //Control del combo de busqueda y de la animacion que permite visualizar el estado de la busqueda
                cmbServidorConeccion.Refresh();
                pibAnimacionTrac.Enabled = true;
                Funcion = new Thread(new ThreadStart(this.metBuscarServidor));
                Funcion.Start();
                Alternal = false;
            }
        }

        private void cmbServidorConeccion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
            //Impedir que se escriba nada en el area de busqueda
        }

        private void btnAcepServidor_Click_1(object sender, EventArgs e)
        {
            if (metExisteArhivo(ServidorDireccion) == false)
                metGuardarArchivo(ServidorDireccion, cmbServidorConeccion.Text);
            //Llamado a los metodos de almacenamiento y creacion del archivo
            metConeccionProcesada();
            //Una ves ingresado los datos de ser necesario se controla el estado de la coneccion
            btnAcepServidor.Enabled = false;
            this.DialogResult = DialogResult.OK;

        }
    }
}
